# -*- encoding: ISO-8859-5 -*-
'''
Created on 29.04.2013

@author: Thom
'''

class Gamestate:

    def setStartState(self):
        """
        Setzt den Startzustand des Spiels
        """
        raise NotImplementedError("You should have implemented this")
    
    def getAllMoves(self):
        """
        Gibt alle mögliche Züge des aktuellen Zustandes zurück
        """
        raise NotImplementedError("You should have implemented this")

    def possibleMove(self, mv):
        """
        überprüft ob der mitgegebene Zu im aktuellen Zustand gültig ist            
        """
        raise NotImplementedError("You should have implemented this")

    def hasNextMove(self):
        """
        Stellt zusammen mit getNextMove() eine Art Iterator-Interface über alle mögliche Züge in diesem Zustand dar.
        Ist true, wenn mit getNextMove() ein weiterer Zug aus der Menge der möglichen (getAllMoves()) geholt werden kann.
        """
        raise NotImplementedError("You should have implemented this")

    def getNextMove(self):
        """
        (siehe Kommentar oben von hasNevtMove())
        Gibt den nächste möglichen Zug zurück, falls noch einer vorhanden ist
        """
        raise NotImplementedError("You should have implemented this")

    def doMove(self, mv):
        """
        Führt den mitgegebenne Zug auf dem aktuellen Zustand aus.
        """
        raise NotImplementedError("You should have implemented this")

    def undoMove(self, mv):
        """
        Macht den mitgegebenen Move rückgängig und stellt so den vorherigen Zustand wieder her.
        """
        raise NotImplementedError("You should have implemented this")

    def getAllChildStates(self):
        """
        Gleich wie getAllMoves()
        """
        raise NotImplementedError("You should have implemented this")

    def hasNextChild(self):
        """
        Gleich wie hasNextMove()
        """
        raise NotImplementedError("You should have implemented this")
    
    def getNextChild(self):
        """
        Gleich wie getNextMove(), nur dass nicht der Zug zurück gegeben wird, sondern der Zustand, der aus dem nächsten Zug resultiert.
        """
        raise NotImplementedError("You should have implemented this")

    def getChild(self, mv):
        """
        Gleich wie doMove, nur dass der Zustand, der erzeugt wird, zurückgegeben wird.
        """
        raise NotImplementedError("You should have implemented this")
    
    def firstPlayerToMove(self):
        """
        Ob der erste Spieler am Zug ist.
        """
        raise NotImplementedError("You should have implemented this")

    def secondPlayerToMove(self):
        """
        Ob der zweite Spieler am Zug ist
        """
        raise NotImplementedError("You should have implemented this")

    def isTerminal(self):
        """
        Ob das Spiel beendet ist (gibt es noch Züge im aktuellen Zustand?)
        """
        raise NotImplementedError("You should have implemented this")

    def firstPlayerToWin(self):
        """
        Ob der erste Spieler gewonnen hat.
        """
        raise NotImplementedError("You should have implemented this")

    def secondPlayerToWin(self):
        """
        Ob der zweite Spieler gewonnen hat.
        """
        raise NotImplementedError("Not implemented")

    def draw(self):
        """
        Ob es unentschieden ist.
        """
        raise NotImplementedError("Not implemented")

    def getMoveHistory(self):
        """
        Gibt die getätigten Züge zurück.
        """
        raise NotImplementedError("Not implemented")

    def getStateHistory(self):
        """
        Gibt die vergangenen Zustände zurück
        """
        raise NotImplementedError("Not implemented")


class Evaluator:


    def heuristicValue(self, gs):
        raise NotImplementedError("Not implemented")

    def simpleHeuristicValue(self, gs):
        raise NotImplementedError("Not implemented")

    def getMinValue(self):
        raise NotImplementedError("Not implemented")


    def getMaxValue(self):
        raise NotImplementedError("Not implemented")

    def exactValue(self, gs):
        raise NotImplementedError("Not implemented")

    def evaluate(self, gs):
        raise NotImplementedError("Not implemented")


class Player:

    def setStartState(self):
        raise NotImplementedError("You should have implemented this")    

    def setFirstPlayer(self):
        raise NotImplementedError("You should have implemented this")    

    def setSecondPlayer(self):
        raise NotImplementedError("You should have implemented this")    

    def setThirdPlayer(self):
        raise NotImplementedError("You should have implemented this")    

    def getNextMove(self):
        raise NotImplementedError("You should have implemented this")    

    def isLegalMove(self):
        raise NotImplementedError("You should have implemented this")    
    
    def doMove(self, mv):
        raise NotImplementedError("You should have implemented this")           
        
    def isStateTerminal(self):
        raise NotImplementedError("You should have implemented this")    

    def firstPlayerToMove(self):
        raise NotImplementedError("You should have implemented this")    

    def secondPlayerToMove(self):
        raise NotImplementedError("You should have implemented this")
    
    def firstPlayerToWin(self):
        raise NotImplementedError("You should have implemented this")    

    def secondPlayerToWin(self):
        raise NotImplementedError("You should have implemented this")    

    def showGamestate(self):
        raise NotImplementedError("You should have implemented this")    


class Move:
    def __init__(self,player,from_x, from_y,to_x,to_y,rem_x,rem_y):
        self.player = player
        self.from_x = from_x
        self.from_y = from_y
        self.to_x = to_x
        self.to_y= to_y
        self.rem_x= rem_x
        self.rem_y = rem_y
    
    def printOut(self):
        print(self)
        
    def __eq__(self, other):
        return self.__dict__ == other.__dict__
    
    def __str__(self):
        return "player " + str(self.player) + " from " + str([self.from_x, self.from_y]) + " to " + str([self.to_x, self.to_y]) + " rem " + str([self.rem_x, self.rem_y])